package com.simple.create.singleton.sample4;


/**
 * 单例模式4
 * 使用内部类来维护单例的实现
 * <p>
 * 原因:
 * JVM的内部机制能保证当一个类在被加载的时候, 这个类的加载过程是线程互斥的
 * 即:
 * 第一次调用com.simple.create.singleton.sample4.Singleton#getInstance()的时候
 * JVM能够保证com.simple.create.singleton.sample4.Singleton.SingletonFactory#instance只被创建一次
 * 并且会保证它的内存初始化完成
 * 同时, 也只会在第一次调用的时候使用互斥机制, 解决了低性能的问题
 * <p>
 * 弊端:
 * 如果构造函数抛出了异常, 则实例永远也创建不了
 *
 * @author simple
 * @version 1.0
 * @date 2018/12/6 14:39
 * @since 1.0
 */
public class Singleton {

    /**
     * 私有的构造方法, 防止被外部实例化(反射?)
     */
    private Singleton() {
    }

    /**
     * 使用内部类来维护单例
     */
    private static class SingletonFactory {
        private static Singleton instance = new Singleton();
    }

    /**
     * 提供静态方法, 用于获取实例
     *
     * @return 实例
     */
    public static Singleton getInstance() {
        return SingletonFactory.instance;
    }

    /**
     * 如果该对象被序列化, 可以保证对象在序列化前后保持一致
     *
     * @return 实例
     */
    public Object readResolve() {
        return getInstance();
    }
}
